package set

import "learngo/containerset/common"

type Undo []func()

type IntSet struct {
	Data map[int]bool
	U common.Undo //撤销操作，这里其实就是个数组，数组放的是反操作的函数
}

func CreateIntSet() IntSet{
	return IntSet{Data: make(map[int]bool)}
}

func (s *IntSet) Contains(x int) bool{
	return s.Data[x]
}

func (s *IntSet) Add(x int) {
	//当成功加入一个，undo里就要注册一个反操作，作为撤销用
	if !s.Contains(x){
		s.Data[x] = true
		s.U.Add(func(){s.Delete(x)})
	}else{
		//没有加入到，则不用反操作
		s.U.Add(nil)
	}
}
func (s *IntSet) Delete(x int){
	//当成功删除一个，undo里就要注册一个反操作，作为撤销用
	if s.Contains(x){
		delete(s.Data, x)
		s.U.Add(func(){s.Add(x)})
	}else{
		//没有加入到，则不用反操作
		s.U.Add(nil)
	}
}
//撤销一次最近的操作
func (s *IntSet) Undo(x int) error{
	return s.U.Undo()
}